package sv.com.seguros.web.controller.asg;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import sv.com.seguros.dto.asg.AsgCliente;
import sv.com.seguros.dto.sgd.SgdUsuario;
import sv.com.seguros.exception.WebException;
import sv.com.seguros.web.controller.BaseController;
import sv.com.seguros.web.util.DBContext;
import sv.com.seguros.web.util.WebUtilidades;

@Controller
@RequestMapping("/clientes")
public class AsgClienteController extends BaseController {

	private static final long serialVersionUID = 3834669882649782965L;
	
	@RequestMapping(value = "/save", method = {RequestMethod.GET, RequestMethod.POST})
	public void save(@ModelAttribute AsgCliente asgCliente, HttpServletResponse response) {
		Map<String, Object> result = new HashMap<String, Object>();
		asgCliente.setAsgClienteFechaCreacion(WebUtilidades.dateFormatAsYYYYMMDDHHMMSS.format(new Date()));
		asgCliente.setSgdUsuario(new SgdUsuario(WebUtilidades.getSgdUsuarioIdFromAcegi()));
		try {
			DBContext.getAsgClienteDao().isClientExtis(asgCliente);
			DBContext.getBaseDao().save(asgCliente);
			result.put("asgClienteId", asgCliente.getAsgClienteId());
			result.put(SUCCESS, true);
			result.put(MESSAGE, UPDATED_DATA);
		} catch (WebException e) {
			logger.error("Exception: ", e);
			result.put(FAILURE, true);
			result.put(MESSAGE, e.getExceptionMessage());
		} catch (Exception e) {
			logger.error("Exception: ", e);
			result.put(FAILURE, true);
			result.put(MESSAGE, DEFAULT_ERROR_MESSAGE);
		}
		serializeObject(result, response);
	}
	
	@RequestMapping(value = "/create", method = {RequestMethod.GET, RequestMethod.POST})
	public String create(ModelMap model, 
			@RequestParam String tipoPersona) {
		try {
			fillDropDowns(model, tipoPersona);
			model.put("isReadOnly", WebUtilidades.isReadOnly(WebUtilidades.ROLE_CLIENTE_POLIZA));
			model.put("allowDelete", WebUtilidades.isAllowDelete(WebUtilidades.ROLE_CLIENTE_POLIZA));
			model.put("create", true);
		} catch (Exception e) {
			logger.error("Exception:", e);
		}
		if("2".equals(tipoPersona))
			return "aseguradora/poliza/asgClienteJuridicoPoliza";
		else
			return "aseguradora/poliza/asgClientePoliza";
	}
	
	@RequestMapping(value = "/abrirExpediente", method = {RequestMethod.GET, RequestMethod.POST})
	public String abrirExpediente(
			@RequestParam Long asgClienteId, 
			ModelMap model) {
		String tipoPersona = ""; 
		try {
			model.put(WebUtilidades.HEADER_TITLE, "CLIENTES / POLIZAS");
			AsgCliente asgCliente = (AsgCliente) DBContext.getBaseDao().findById(AsgCliente.class, asgClienteId);
			tipoPersona = WebUtilidades.CTG_TIPO_PERSONA_JURIDICA.equals(asgCliente.getCtgTipoPersona().getCtgCatalogoHijo()) ? "2" : "1";
			fillDropDowns(model, tipoPersona);
			model.put("asgClienteId", asgClienteId);
			model.put("asgCliente", asgCliente);
			model.put("asgPolizas", JSONArray.fromObject(DBContext.getAsgPolizaDao().findAllByAsgClienteId(asgClienteId)));
			model.put("isReadOnly", WebUtilidades.isReadOnly(WebUtilidades.ROLE_CLIENTE_POLIZA));
			model.put("allowDelete", WebUtilidades.isAllowDelete(WebUtilidades.ROLE_CLIENTE_POLIZA));
		} catch (Exception e) {
			logger.error("Exception:", e);
		}
		if("2".equals(tipoPersona))
			return "aseguradora/poliza/asgClienteJuridicoPoliza";
		else
			return "aseguradora/poliza/asgClientePoliza";	
	}
	
	@RequestMapping(value = "/deleteCliente", method = {RequestMethod.GET, RequestMethod.POST})
	public void deleteCliente(@RequestParam Long asgClienteId, HttpServletResponse response) {
		Map<String, Object> result = new HashMap<String, Object>();
		try {
			DBContext.getAsgClienteService().deleteAsgCliente(asgClienteId);
			result.put(SUCCESS, true);
			result.put(MESSAGE, UPDATED_DATA);
		} catch (WebException e) {
			logger.error("Exception: ", e);
			result.put(FAILURE, true);
			result.put(MESSAGE, e.getExceptionMessage());
		} catch (Exception e) {
			logger.error("Exception: ", e);
			result.put(FAILURE, true);
			result.put(MESSAGE, DEFAULT_ERROR_MESSAGE);
		}
		serializeObject(result, response);
	}
	
	private void fillDropDowns(ModelMap model, String tipoPersona){
		try {
			model.put("ctgPlanes", JSONArray.fromObject(DBContext.getCtgPlanDao().findAllActivesAsArray()));
			model.put("ctgAseguradoras", JSONArray.fromObject(DBContext.getCtgAseguradoraDao().findAllActivesAsArray()));
			model.put("ctgAsesores", JSONArray.fromObject(DBContext.getCtgAsesorDao().findAllActivesAsArray()));
			model.put("ctgTipoPersonas", DBContext.getCtgCatalogoDao().findByCodigo("2".equals(tipoPersona) ? WebUtilidades.CTG_TIPO_PERSONA_JURIDICA : WebUtilidades.CTG_TIPO_PERSONA_NATURAL));
			model.put("ctgTipoClientes", JSONArray.fromObject(DBContext.getCtgCatalogoDao().findAllActivesByCodigoAsArray(WebUtilidades.CTG_TIPO_CLIENTE_PADRE)));
			model.put("ctgClasificaciones", JSONArray.fromObject(DBContext.getCtgCatalogoDao().findAllActivesByCodigoAsArray(WebUtilidades.CTG_CLASIFICACION_EMRESA_PADRE)));
			model.put("ctgTipoSeguros", JSONArray.fromObject(DBContext.getCtgCatalogoDao().findAllActivesByCodigoAsArray(WebUtilidades.CTG_TIPO_SEGUROS_PADRE)));
			model.put("ctgFormasPago", JSONArray.fromObject(DBContext.getCtgCatalogoDao().findAllActivesByCodigoAsArray(WebUtilidades.CTG_FORMA_PAGO_PADRE)));
			model.put("ctgDepartamentos", JSONArray.fromObject(DBContext.getCtgCatalogoDao().findAllActivesByCodigoAsArray(WebUtilidades.CTG_DEPARTAMENTOS_PADRE)));
			model.put("ctgProfesiones", JSONArray.fromObject(DBContext.getCtgCatalogoDao().findAllActivesByCodigoAsArray(WebUtilidades.CTG_PROFESION_PADRE)));
			model.put("ctgEstadosCivil", JSONArray.fromObject(DBContext.getCtgCatalogoDao().findAllActivesByCodigoAsArray(WebUtilidades.CTG_ESTADO_CIVIL_PADRE)));
			model.put("ctgMunicipios", JSONArray.fromObject(DBContext.getCtgMunicipioDao().findAllActivesAsArray()));
			model.put("ctgColonias", JSONArray.fromObject(DBContext.getCtgColoniaDao().findAllActivesAsArray()));
		} catch (Exception e) {
			logger.error("Exception:", e);
		}
	}

}
